package com.meimeixia.pattern.singleton.demo7;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
 * 测试使用反射破坏单例模式
 *
 * @author: t-zhijiang.zhao
 * @date: 2024/11/26 上午9:59
 */
public class Client {
    public static void main(String[] args) throws Exception {
        // 调用方法进行测试...
//        writeObjectToFile();
        readObjectFromFile();
        readObjectFromFile();


        /*
        * instance = com.meimeixia.pattern.singleton.demo7.Singleton@76fb509a
          instance = com.meimeixia.pattern.singleton.demo7.Singleton@76fb509a
        * */
    }

    // 从文件中读取数据(对象)
    public static void readObjectFromFile() throws Exception {
        // 1.创建对象输入流对象
        ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(Paths.get("C:\\Users\\zhaoz\\Desktop\\a.txt")));
        // 2.读取对象
        Singleton instance = (Singleton) ois.readObject();
        System.out.println("instance = " + instance);
        // 3.释放资源
        ois.close();
    }

    // 向文件中写数据（对象）
    private static void writeObjectToFile() throws Exception {
        // 1. 获取Singleton对象
        Singleton instance = Singleton.getInstance();
        // 2. 创建对象输出流对象
        ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(Paths.get("C:\\Users\\zhaoz\\Desktop\\a.txt")));
        // 3. 写对象
        oos.writeObject(instance);
        // 4. 释放资源
        oos.close();
    }
//    instance = com.meimeixia.pattern.singleton.demo7.Singleton@7eda2dbb
//    instance = com.meimeixia.pattern.singleton.demo7.Singleton@6576fe71
    /*
    运行以上主方法之后，发现桌面上生成了一个a.txt文件，当然了，你也别打开去看了，因为打开看的话你也看不懂。
    测试完向文件中写数据的操作之后，咱们再来测试从文件中读取数据的操作。
    * 运行以上主方法之后，打印结果如下图所示，可以看到两次打印出来的对象地址不是同一个地址，即两次从文件里面读取到的对象不是同一个对象，
    这就说明序列化和反序列化已经破坏了单例模式。
    * */
}
